﻿using System.Collections.Generic;

namespace DimensionsHelper.Common.Contracts.Table;

public interface ITable : IEnumerable<ILine>
{
    /// <summary>
    ///     上一个有效内容的索引。
    /// </summary>
    int LastEndIndex { get; }

    /// <summary>
    ///     当前表格的上一个表格。
    /// </summary>
    ITable? PreviousTable { get; }

    /// <summary>
    ///     当前表格的前一个表格。
    /// </summary>
    ITable? NextTable { get; }

    /// <summary>
    ///     当前表格的上一个原始表格（在同一个文件内的表格）。
    /// </summary>
    ITable? PreviousOriginalTable { get; }

    /// <summary>
    ///     当前表格的下一个原始表格（在同一个文件内的表格）。
    /// </summary>
    ITable? NextOriginalTable { get; }

    /// <summary>
    ///     当前表格是否是显著性检验表格。
    /// </summary>
    bool IsSignificantTestTable { get; }

    /// <summary>
    ///     当前表格的列显著性字母标记行。
    /// </summary>
    ILine? SignificantTestColumnCharacterLine { get; }

    /// <summary>
    ///     当前表格起始行的原始索引。
    /// </summary>
    int StartLineIndex { get; }

    /// <summary>
    ///     当前表格结束行的原始索引。
    /// </summary>
    int EndLineIndex { get; }

    /// <summary>
    ///     当前表格的总列数，应当是所有行单元格数量的最大值。
    /// </summary>
    int Columns { get; }

    /// <summary>
    ///     当前表格标题单元格。
    /// </summary>
    ICell TitleCell { get; }

    /// <summary>
    ///     当前表格的行总数。
    /// </summary>
    int Count { get; }

    /// <summary>
    ///     获取表格中指定索引位置的行。
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    ILine this[int index] { get; }

    /// <summary>
    ///     尝试依据行类型查找指定行，如果有多个符合的，将返回第一个。
    /// </summary>
    /// <param name="lineType">指定行类型</param>
    /// <returns>第一个符合类型的行，如果没有，将返回null。</returns>
    ILine? GetSpecialLine(LineType lineType);

    /// <summary>
    ///     尝试获取指定显著性ID的列号
    /// </summary>
    /// <param name="id">指定列显著性ID</param>
    /// <param name="column">数字列号，0开始</param>
    /// <returns>如果指定ID存在，返回true，否则，返回false。</returns>
    bool TryGetSignificantTestIdColumn(char id, out int column);

    /// <summary>
    ///     获取指定列的显著性ID号。
    /// </summary>
    /// <param name="column">数字列号，0开始</param>
    /// <param name="id">指定列显著性ID</param>
    /// <returns>如果指定列存在，返回true，否则，返回false。</returns>
    bool TryGetColumnSignificantTestId(int column, out char id);

    /// <summary>
    ///     将指定行添加到表格中。
    /// </summary>
    /// <param name="line"></param>
    void Add(ILine line);

    /// <summary>
    ///     结束当前表格，调用此方法后，将无法添加新的行。
    /// </summary>
    void Finish();

    /// <summary>
    ///     查找第一个单元格内容和给定文本相同的行索引
    /// </summary>
    /// <param name="firstCellContent">查找的文本内容</param>
    int FindIndex(string firstCellContent);

    /// <summary>
    ///     按照另一个表格的行顺序排序当前表格
    /// </summary>
    /// <param name="table"></param>
    void OrderBy(ITable table);
}